package com.itfreer.bpm.flow.api;

import java.util.List;

import com.itfreer.bpm.flow.findwork.para.FindWorkInfo;
import com.itfreer.bpm.history.entity.BpmHistoryEntity;
import com.itfreer.bpm.messager.BpmMessage;
import com.itfreer.bpm.option.para.OptionInfo;
import com.itfreer.bpm.power.para.UserInfo;

/**
 * 流程驱动服务类
 * @author gj
 *
 * @param <T>
 */
public interface IBpmWorkFlowService <T extends IBpmProjectEntity>{
	/**
	 * 查询工作
	 * @param info 项目信息
	 * @param user 用户信息
	 */
	public void findWork(FindWorkInfo info,UserInfo user);

	/**
	 * 获取流程下一个节点信息
	 * @param definedid 流程定义id
	 * @param entity 项目实体
	 * @param editHistory 审批信息
	 * @param user 用户信息
	 */
	public OptionInfo getNextTask(String definedid, IBpmProjectEntity entity, List<BpmHistoryEntity> editHistory,
			UserInfo user);
	
	/**
	 * 项目提交操作
	 * @param oInfo 操作信息
	 * @param entity 项目实体
	 * @param user 用户
	 * @return
	 */
	public BpmMessage signTask(OptionInfo oInfo,T entity,UserInfo user);
	
	/**
	 * 获取退回节点信息
	 * @param definedid 流程定义id
	 * @param entity 项目实体
	 * @param editHistory 审批信息
	 * @param user 用户信息
	 */
	public OptionInfo getBackTask(String definedid, IBpmProjectEntity entity, List<BpmHistoryEntity> editHistory,
			UserInfo user);
	
	/**
	 * 流程退回操作
	 * @param oInfo 操作信息
	 * @param entity 项目实体
	 * @param user 用户
	 * @return
	 */
	public BpmMessage sendBaskTask(OptionInfo oInfo,T entity,UserInfo user);
	
	/**
	 * 获取流程下一个节点信息
	 * @param definedid 流程定义id
	 * @param entity 项目实体
	 * @param editHistory 审批信息
	 * @param user 用户信息
	 */
	public OptionInfo getSkipTask(String definedid, IBpmProjectEntity entity, List<BpmHistoryEntity> editHistory,
			UserInfo user);
	
	/**
	 * 流程退回操作
	 * @param oInfo 操作信息
	 * @param entity 项目实体
	 * @param user 用户
	 * @return
	 */
	public BpmMessage skipTask(OptionInfo oInfo,T entity,UserInfo user);
	
	/**
	 * 流程退件操作
	 * @param oInfo 操作信息
	 * @param entity 项目实体
	 * @param user 用户
	 * @return
	 */
	public BpmMessage disposal(OptionInfo oInfo,T entity,UserInfo user);
	
	/**
	 * 项目复活
	 * @param optInfo
	 * @param entity
	 * @param user
	 * @return
	 */
	public BpmMessage easter(OptionInfo optInfo, T entity, UserInfo user);
	
	/**
	 * 流程保存操作
	 * @param oInfo
	 * @param entity
	 * @param user
	 * @return
	 */
	public BpmMessage processSave(OptionInfo oInfo,T entity,UserInfo user);
	
	/**
	 * 用户自定义一次退件操作
	 * @param oInfo
	 * @param entity
	 * @param user
	 * @return
	 */
	BpmMessage userDispose(OptionInfo oInfo, IBpmProjectEntity entity, UserInfo user);
}
